/*
 * @(#)ProductServiceFallBackFactory.java 2021年3月10日
 *
 * Copyright (c) 2010 by rayootech.com. All rights reserved.
 */
package com.nuctech.order.service.fallback;

import org.springframework.stereotype.Component;

import com.nuctech.common.bean.C;
import com.nuctech.common.entity.Product;
import com.nuctech.order.service.ProductService;

import cn.hutool.core.util.StrUtil;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;

/**
 * Feign商品微服务调用接口熔断工厂
 *
 * 这是一个容错工厂，需要实现Feign所在的接口，并去实现接口中的所有方法
 * 一旦Feign远程调用出现问题，就会进入当前类中同名方法执行容错逻辑
 *
 * @author lilu
 * @date 2021年3月10日
 * @since 1.0.0
 */
@Slf4j
@Component
public class ProductServiceFallBackFactory implements FallbackFactory<ProductService> {

	@Override
	public ProductService create(Throwable cause) {
		String msg = C.INTERFACE_FAILURE.getMessage();
		if (cause != null && StrUtil.isNotBlank(cause.getMessage())) {
			log.error(cause.getMessage(), cause);
			msg = StrUtil.format("{}，MSG:{}", msg, cause.getMessage());
		}

		final String message = msg;

		return new ProductService() {
			@Override
			public Product product(Integer pid) {
				// 容错逻辑
				return new Product(-1, "远程调用微服务异常：" + message, null, null);
			}

			@Override
			public Integer reduceInventery(Integer pid, Integer number) {
				return -1;
			}
		};
	}

}
